# 网站信息表，SEO
class Site(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32,verbose_name='网站标题')
    abstract=models.CharField(max_1ength=128,verbose_name='网站简介')
    key_words=models.CharField(max_length=l28,verbose_name='网站关键字')
    record=models.CharField(max_length=32,verbose_name='网站备案号')
    create_date=models.DateTimeField(verbose_name='建站日期')
    version=models.CharField(max_length=16,verbose_name='网站版本号')
    icon=models.FileField(verbose_name='网站图标',upload_to='site_icon/')
    def __str__(self):
        return self.title
    class Meta:
        verbose_name_plural='网站信息'

# 个人信息，展示个人的名片，联系方式等
class MyInfo(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32,verbose_name='名字')
    job=models.CharField(max_length=128,verbose_name='工作')
    email=models.EmailField(max_length=64,verbose_name='邮箱')
    site_url=models.CharField(max_length=32,verbose_name='网站链接')
    addr=models.CharField(max_length=16,verbose_name='地址')
    bilibili_url=models.URLField(verbose_name='哔哩哔哩链接')
    github_url=models.URLField(verbose_name='GitHub链接')
    wechat_img=models.FileField(verbose_name='微信图片',uplod_to='my-info/')
    qq_img=models.FileField(verbose_name='QQ',upload_to='my_info/')
    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural='个人信息'

# 用户表，对dj自带的表进行扩充
# 需要在settings中配置AUTH_USER_MODEL="app.UserInfo"
# 支持用户充值积分变现
# 不让用户自己上传图片，避免违规
class UserInfo(Abstractuser):
    nid=models.AutoField(primary_key=True)
    sign_choice =(
        (0,'用户名注册'),
        (1,'手机号注册'),
        (2,'邮箱注册'),
        (3,'QQ注册'))
    nick_name=models.CharField(max_length=16,verbose_name='昵称')
    sign_status=models.IntegerField(default=0,choices=sign_choice,verbose_name='注册状态')
    tel=models.CharField(verbose_name='手机号',max_length=l2,null=True,blank=True)
    integral=models.IntegerField(default=20,verbose_name='用户分')
    token=models.CharField(verbose_name="TOKEN",max_length=64,null=True,blank=True)
    avatar=models.ForeignKey(
        to='Avatars',
        to_field='nid',
        on_delete=models.SET_NULL,
        verbose_name='用户头像',
        null=True,
        blank=True,
    )
    collects=models.ManyToManyField(
        to='Article',
        verbose_name='收藏',
        related_name='collects',
        blank=True,
    )
    class Meta:
        verbose_name_plural='用户'

# 用户头像表，头像看看有没有外部的网站
# 根据首字母生成头像的api，国内貌似慢 https://ui-avatars.com/ 使用 <img src="https://ui-avatars.com/api/?name=John+Doe">  
# 随机头像生成 https://github.com/wave-charts/avatar-gen/
# 需要settings中配置 MEDIA_ROOT  MEDIA_URL
# url中需要配置 re_path(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),)
class Avatars(models.Model):
    nid=models.AutoField(primary_key=True)
    url=models.ImageField(verbose_name='头像',upload_to='avatars/')
    def __str__(self):
        return self.url
    class Meta:
        verbose_name_plural='用户头像'

## 下面是文章表中的内容
# 使用信号机制  https://zhuanlan.zhihu.com/p/103591746
# 以下是当删除头像时触发，同时删除对应的图片文件，节省空间
@receiver(pre_delete,sender=Avatars)  #sender=你要删除或修改文件字段所在的类**
def download_delete(instance,*kwargs):#函数名随意
    #print('进入文件删除方法，删的是'，instance,Ur1)#时于则试
    instance.url.delete(False)  # file是保存文件或图片的字役名**

# 文章表
# 文章推荐有6个推荐位
# 文章封面是选择的，避免违规
class Articles(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(verbose_name='标题',max_length=32,null=True,blank=True)
    abstract=models.CharField(verbose_name='文章简介',max_length=128,null=True,b1ank=True)
    content=models.TextField(verbose_name='文章内容',null=True,blank=True)
    create_date=models.DateTimeF1eld(verbose_name='文章发布日期',auto_now_add=True,null=True)
    change_date=models.DateTimeField(verbose_name='文章修改日期',auto_now=True,null=True)
    status_choice=(
            (0,'未发布'),
            (1,'已发布')
        )
    status=models.IntegerField(verbose_name='文章保存状态',choices=status_choice)
    recommend=models.BooleanField(verbose_name='是否上推荐',default=True)
    cover=models.ForeignKey(
        to='Cover',
        to_field='nid',
        on_delete=models.SET_NULL,
        verbose_name='文章封面',null=True,blank=True)
    look_count=models.IntegerField(verbose_name='文章阅读量',default=0)
    comment_count=models.IntegerField(verbose_name='文章评论量',default=0)
    digg_count=models.IntegerField(verbose_name='文章点赞量',default=0)
    collects_count=models.IntegerField(verbose_name='文章收藏数',default=0)
    category_choice=(
            (0,'技术'),
            (1,'生活'),
            (2,'随笔'),
            (3,'前端'),
            (4,'后端')
        )
    category = models.IntegerField(verbose_name='文章分类',choices=category_choice,null=True,blank=True)
    tag = models.ManyToManyField(
        to='Tag',
        verbose_name='文章标签',
        related_name='tag',
        blank=True,
    )
    author = models.CharField(verbose_name='文章作者',max_length=16,null=True,blank=True)
    source = models.CharField(verbose_name='文章来源',max_length=32,null=True,blank=True)

    def __str__(self):
        return self.title
    class Meta:
        verbose_name_plural='文章'

# 评论
# 评论用外键，表示对哪篇文章评论
# 父评论删除后，所有的子评论都失效
class Comment(models.Model):
    nid=models.AutoField(primary_key=True)
    digg_count=models.IntegerField(verbose_name='',default=0)
    article=models.ForeignKey(verbose_name='评论文章',to='Articles',to_field='nid',on_delete=models.CASCADE)
    user=models.ForeignKey(verbose_name='评论人',to='UserInfo',to_field='nid',on_delete=models.CASCADE,null=True)
    content=models.TextField(verbose_name='评论内容')
    comment_count=models.IntegerField(verbose_name='子评论数',default=0)
    drawing=models.TextField(verbose_name='配图',null=True,blank=True)
    create_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    parent_comment=models.ForeignKey('self',nunl=True,blank=True,on_delete=models.CASCADE,verbose_name='是否是父评论')
    
    def __str__(self):
        return self.content
    class Meta:
        verbose_name_plural='评论'

# 新闻爬取记录
class NewsRecord(models.Model):
    nid=models.AutoField(primary_key=True)
    url=models.CharField(verbose_name='新闻链接',max_length=256,null=True,blank=True)
    create_date= models.DateTimeField(verbose_name='爬取时间',auto_now_add=True)

    class Meta:
        verbose_name_plural='新闻爬取记录'

# 文章封面
class Cover(models.Model):
    nid=models.AutoField(primary_key=True)
    url=models.ImageField(verbose_name='文章封面',upload_to='cover/')
    def __str__(self):
        return str(self.url)
    class Meta:
        verbose_name_plural='文章封面'

# 文章标签
class Tag(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(verbose_name='文章标签',max_length=16,null=True,blank=True)
    def __str__(self):
        return self.name
    class Meta:
        verbose_name_plural='文章标签'

# 文章专题：把相关的知识点整理到一起，方便复习

# 图片文章